页面缩放怎么做,并且按窗口记住?
考察点
setZoomFactor和webFrame.setZoomLevel的差别- 缩放状态存在哪
参考答案
1. 用主进程设缩放
function applyZoom(win, factor) {
const next = Math.min(1.5, Math.max(0.8, factor));
win.webContents.setZoomFactor(next);
return next;
}
ipcMain.handle('zoom:set', (event, factor) => {
const win = BrowserWindow.fromWebContents(event.sender);
const next = applyZoom(win, factor);
// 按窗口业务 key 存,而不是所有窗口共用一个值
store.set(`zoom.${win.kind}`, next);
return next;
});
setZoomFactor(1) 是 100%,1.2 是 120%。用倍数比 setZoomLevel 的指数级别更好向用户解释。
在创建窗口并 ready-to-show 之前设好,避免先以 100% 画一帧再跳变。
2. 为什么少在页面里用 webFrame
webFrame.setZoomLevel 能在渲染进程改缩放,但:
- 每个页面都要自己调,新窗口会漏
- preload 在 sandbox 里不一定方便拿 webFrame 做持久化
- 和系统 Ctrl+加号 两套缩放手感会叠在一起
Ctrl 加滚轮、Ctrl+加号如果要自定义,在 before-input-event 里拦截后调用上面的 applyZoom,否则 Chromium 默认缩放和你存的值会打架。拦截前想清楚:用户会习惯浏览器的缩放快捷键,拦掉就要自己提供菜单项。
3. 记住的范围
- 主界面和设置可以不同缩放,key 分开
- 存在
userData的 store 里,不要写进安装目录 - 第二个显示器 DPI 不同时,Electron 的 factor 是相对该窗口的,一般不用再乘 devicePixelRatio
限制在 0.8 到 1.5,避免用户放到看不清或布局溢出后找不到入口。菜单里留“重置为 100%”。
面试话术
缩放用 webContents.setZoomFactor,在显示窗口前设上一次,避免闪动。数值按窗口类型存在 userData。范围夹在 0.8 到 1.5,并提供重置。默认的 Ctrl 加号如果保留,就不要再写一套页面里的 webFrame 缩放和它抢。
常见追问
- zoomFactor 和 CSS zoom 比呢? CSS zoom 不缩放所有布局单位,也影响截图和点击坐标。整页缩放用 webContents。
- 子 WebContentsView 会继承吗? 不会。每个 webContents 各自 setZoomFactor。